import allure
from utils.LogUtil import logger
from apiCore.RequestCore import RequestCore
from utils.AssertUtil import AssertUtil
from utils.ExtractUtil import ExtractUtil
from utils.fileUtil import FileUtil


class ApiService:

    def __init__(self):
        self.requestCore = RequestCore()
        self.extract_util = ExtractUtil()
        self.assert_util = AssertUtil()
        self.file_util = FileUtil()

    def handle_case(self, test_data):
        """
        处理接口用例请求数据
        :param test_data:
        :return:
        """
        # 获取接口请求URL
        api_url = test_data["request_info"]["url"]
        # 获取接口请求方法
        method = test_data["request_info"]["method"]
        # 获取接口请求头
        headers = test_data["request_info"]["headers"]
        headers = self.extract_util.extract_yaml_info(headers)

        # 获取case_info
        case_info = test_data["case_info"]

        # 获取用例标题
        case_title = case_info.pop("case_title",None)
        logger.info(f"接口用例标题:{case_title}")
        # allure.dynamic.title(case_title)  # 设置为allure报告用例标题
        # 确保在测试上下文环境中
        if allure.dynamic.title:  # 检查是否在allure上下文中
            allure.dynamic.title(case_title)
        else:
            logger.warning("不在Allure测试上下文中，无法设置动态标题")

        # 获取断言validate  使用pop方法，确保case_info里面最后只剩下接口所需要的数据json/data/params
        validate = case_info.pop("validate", None)
        # 获取extract(从响应数据找到对应结果需要写到yaml文件)
        extract = case_info.pop("extract", None)

        # # 获取files
        files = case_info.pop("files", None)
        if files:
            files = self.file_util.read_file(files)

        # 去除掉断言等其它字段后（自己在yaml文件写的），只剩下所需要的数据json/data/params  那么就是我们所需要的请求参数
        try:
            case_info = self.extract_util.extract_yaml_info(case_info)
        except:
            case_info = None

        # 发起请求
        response = self.requestCore.do_request(url=api_url, method=method, headers=headers, files=files, **case_info)

        # 处理extract(从响应数据找到对应结果需要写到yaml文件)
        self.extract_util.extract_case(response, extract)
        # 处理断言  模版替换
        validate = self.extract_util.extract_yaml_info(validate)
        self.assert_util.validate_response(response, validate)

        return response
